// 快照沙箱
// 那么这个沙箱呢它是针对于给当前的全局变量实现一个快照的方式来记录我们沙箱的内容，
// 那么在我们的子应用切换之后呢我们将所有的沙箱的变量给它置为初始值

/**
 * 但是呢对于快照这东西来说我们的消耗和我们的执行性能都是比较差的，那么一个 window 对象上可能会挂很多的属性，
 * 那么window的属性是非常非常多的，那么这个时候如果说我们都是给它做一个快照的处理我们的消耗呢也是非常大的。
 * 应用场景：
 * 快照沙箱只适合在比较老浏览器里面
 */

export class SnapShotSandbox {
  constructor(){
    // 1. 代理对象

    // 那么我们让它的 proxy 就等于当前的 window，那么这样呢我们之后就可以使用 proxy 这个代理的对象来完成我们全局对象的替换
    this.proxy = window;
    this.active();
  }
  // 沙箱激活
  active(){
    // 创建一个沙箱快照
    this.snapshot = new Map();
    // 遍历全局环境
    for(const key in window){
      // 那么这个时候呢我们要记录 window 上所有 key值和value值，然后遍历的过程中我们需要将 window 所有的key值记录在我们的 快照这个对象上
      this.snapshot[key] = window[key];
    }
  }
  // 沙箱销毁
  inactive(){
    // 这个时候我们在遍历的时候就需要判断一下如果说window的key和我们snapshot的key是不相等的我们就将它重新赋值
    for(const key in window){
      if(window[key] !== this.snapshot[key]){
        // 还原操作，我们要还原的是我们的 window 对象
        window[key] = this.snapshot[key];
      }
    }
  }
}


